function PathCreationManager(){
    this.constant_backendCreation='http://admin.festivalscienza.it/jsonget.php?get=insertpath';
    this.maxPosition=0; //la posizione d'ordine dell'ultimo elemento
    this.time=null;
    this.startingPosition=null; //il marker per la posizione inziale
    this.startingPositionName="";
    this.path=Array();//array associativo sul parametro d'ordine degli eventi
    this.win=new google.maps.InfoWindow();
    this.time=0;
    //this.startPointPosition;
    this.geocod=new google.maps.Geocoder();
    this.STAT_VOID=0;
    this.STAT_PLACING_STARTING_POINT=1;//qui il marker ha una posizione
    this.STAT_SETTING_TIME=2;
    this.STAT_CREATING_PATH=3;
    this.STAT_PATH_CREATED=4;
    this.status=this.STAT_VOID;

    this.setStatus=function(status){
        this.status=status;
        switch(status){
            case this.STAT_VOID:
                //il marker non è ancora displayato
                if(this.startingPosition!=null){
                    //qualcosa per dire se vuole cancellare il percorso vecchio
                    //else
                    this.startingPosition.setMap(null);
                }
                if(this.win){
                    this.win.close();
                }
                mapman.hideAllPaths();
                graphman.redrawNewPathDiv();
                phcman.time=0;
                break;
            case this.STAT_PLACING_STARTING_POINT:
                this.win.close();
                mapman.hideAllPaths();
                this.path=Array();
                this.maxPosition=0;
                this.startingPosition.setDraggable(true);
                break;
            case this.STAT_SETTING_TIME:
                this.startingPosition.setDraggable(false);
                break;
            case this.STAT_CREATING_PATH:
                this.time=document.getElementById('time').value;
                this.win.close();
                alert("Il tuo percorso iniziera' alle ore "+this.printTime(this.time)+"\nOra puoi selezionare gli eventi a cui partecipare!");
                graphman.redrawNewPathDiv();
                break;
            case this.STAT_PATH_CREATED:
                break;
        }

    }
    
    this.createStartingPoint=function(){
        //scegli il punto di partenza:
        this.setStatus(phcman.STAT_VOID);
        alert("Scegli il punto di partenza");
        //punto di partenza x
        this.startingPosition = new google.maps.Marker({
            position: mapman.map.getCenter(),
            map: mapman.map,
            title:"Punto di partenza",
            draggable:true,
            icon:'resources/img/arr.png'
        });
        google.maps.event.addListener(this.startingPosition, 'click', function() {
            phcman.startingMarkerClicked();
        });
        google.maps.event.addListener(this.startingPosition, 'dragend', function() {
            phcman.startingMarkerClicked();
        });
        this.setStatus(phcman.STAT_PLACING_STARTING_POINT);
    }

    /**
     * funzione che permette di salvare il percorso su database
     */
    this.savePath=function(callback){
        var tr=confirm('Stai per salvare il percorso');
        var params=new Object();             
        var a;
        if(tr==true){
            params.get="insertpath";
            params.nome=escape(this.startingPositionName);
            params.giorno=document.getElementById('giorni').value;
            params.ini=this.printDbTime(this.time);
            params.utente=getUtente();
            if(this.startingPosition!=null){
                params.lat=this.startingPosition.position.lat();
                params.lon=this.startingPosition.position.lng();
            }        
            for(var j in this.path){
                if(this.path[j]!=null){
                    a=this.path[j];//servono id evento, orario, ordine
                    params['e_'+a.eventi_id]=a.tempoInizio+"_"+a.tempoFine+"_"+a.ordine;
                }
            }
            //document.getElementById('footer-cd').innerHTML+=jsonQueryGetUrl(params, phcman.constant_backendCreation, function(responseObject) {
            //pathman.encodePathData(responseObject,callback);
            //},function() {
            //    alert('Errore', 'Si &egrave; verificato un errore nel corso del caricamento del percorso. Ricaricare la pagina. Se il problema persiste contattare l\'amministratore di sistema '+evtman.constant_backendEvents);
            //});
        
            jsonQuery(params, phcman.constant_backendCreation, function(responseObject) {
                //dovrebbe essere null, ergo
                //alert(dump(responseObject));
                //
                //pathman.encodePathData(responseObject,callback);
                pathman.getPathList(ctrl.callbackPathsReloaded);
            //qui dovrei ricaricare gli eventi
            },function() {
                alert('Errore', 'Si &egrave; verificato un errore nel corso del caricamento del percorso. Ricaricare la pagina. Se il problema persiste contattare l\'amministratore di sistema '+evtman.constant_backendEvents);
            });
            phcman.setStatus(phcman.STAT_VOID);
        }
        
        return tr;
    }

    this.redrawWin=function(){
        switch(phcman.getStatus()){
            case this.STAT_PLACING_STARTING_POINT:
                phcman.startingPositionName="";
                this.win.setContent(this.getStartingMarkerContent());
                break;
            case this.STAT_SETTING_TIME:
                var smc=this.getStartingMarkerTimeRequest();
                this.win.setContent(smc);
                //alert("prova");
                break;
            case this.STAT_CREATING_PATH:
                this.win.setContent(this.getStartingMarkerContent());
                //la finestra di norma non si dovrebbe vedere, quindi la mostro
                break;
        }
        this.win.open(mapman.map,this.startingPosition);
    }

    //CALLBACK------------------------------------------------------------------
    /**
     * richiesta di visualizzazione del box si/no che permette di salvare il marker
     */
    this.startingMarkerClicked=function(){
        this.redrawWin();
    }

    /**
     * metodo che permette di caricare la posizione se ce n'è bisogno,
     * callback indipendente dallo status
     */
    this.loadedMarkerPosition=function(arr,status){
        //arr;//Array.<GeocoderResult>
        //status;//GeocoderStatus
        if(status=='OK'){
            phcman.startingPositionName=arr[0]['formatted_address'];
            //document.getElementById('startingMarkerContent').innerHTML=arr[0]['formatted_address']+"<br/>";
            if(phcman.getStatus()==phcman.STAT_PLACING_STARTING_POINT)
                phcman.win.setContent(phcman.getStartingMarkerContent());
        }
    }

    /**
     * il tempo di inizio del percorso è stato impostato
     */
    this.setStartTime=function(){
        phcman.setStatus(phcman.STAT_CREATING_PATH);
    }
    /**
     * viene richiesto il tempo di inizio del percorso
     */
    this.askPathTime=function(){
        phcman.setStatus(phman.STAT_SETTING_TIME);
    }
    /**
     * reset, in questo caso lo starting marker non è posizionato, mi riporto
     * allo stato iniziale
     */
    this.startingMarkerNotPlaced=function(){
        phcman.setStatus(this.STAT_PLACING_STARTING_POINT);
    }
    /**
     * in questo caso lo starting marker è posizionato, proseguo per impostare
     * il tempo
     */
    this.startingMarkerPlaced=function(){
        this.setStatus(phcman.STAT_SETTING_TIME);
        phcman.redrawWin();
    //google.maps.event.clearListeners(this.startingPosition, 'click');
    }
    //FINE CALLBACK-------------------------------------------------------------
    /**
     * metodo che recupera il contenuto da inserire nel balloon quando
     * è necessario selezionare l'evento
     */
    this.getStartingMarkerContent=function(){
        var ret="";
        ret+="<div style=\"text-align:center;\">";
        if(this.getStatus()==this.STAT_PLACING_STARTING_POINT){
            ret+="Vuoi inserire qui il tuo punto di partenza?<br/>";
        } else if(this.getStatus()==this.STAT_CREATING_PATH){
            ret+="Punto di partenza selezionato<br/>";
        }
        //ret+="lat: "+pos.lat().toFixed(2)+" - lng: "+pos.lng().toFixed(2)+"<br/>";
        ret+="<span id='startingMarkerContent'>"+this.startingPositionName+"</span><br/>";
        this.geocod.geocode({
            location:this.startingPosition.position
        },this.loadedMarkerPosition);
        if(this.getStatus()==this.STAT_PLACING_STARTING_POINT){
            ret+="<a href=\"javascript:phcman.startingMarkerPlaced();\">si</a>";
            ret+="&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"javascript:phcman.startingMarkerNotPlaced();\">no</a> ";
        } else {
            ret+="Ora di inizio: "+this.printTime(this.time)+"<br/>";
            ret+="<a href=\"javascript:phcman.startingMarkerNotPlaced();\">Rimuovi punto di partenza</a>";
        }
        ret+="</div>";
        return ret;
    }

    /**
     * Restituisce il contenuto del balloon all'atto di selezione del tempo
     */
    this.getStartingMarkerTimeRequest=function(){
        var ret="";
        ret+="<div style=\"text-align:center;\">";        
        ret+="Inserisci il tempo di inizio del tuo percorso<br/>";
        ret+="<div id='slider_solow' style='align:center;' />";
        ret+=getTimer();
        ret+="</div>";
        //ret+="lat: "+pos.lat().toFixed(2)+" - lng: "+pos.lng().toFixed(2)+"<br/>";
        ret+="<span id='startingMarkerContent'>"+this.startingPositionName+"</span><br/>";
        this.geocod.geocode({
            location:this.startingPosition.position
        },this.loadedMarkerPosition);
        ret+="<a href=\"javascript:phcman.setStartTime();\">ok</a>";
        ret+="</div>";
        return ret;
    }

    /**
     * Restituisce il timer
     */
    function getTimer(){
        var ret="<select id='time'>";
        for(var i=6;i<=23;i++){
            ret+="<option value='"+i+"'>"+i+":00</option>";
            ret+="<option value='"+i+".5'>"+i+":30</option>";
        }
        ret +="</select>";
        return ret;
    }

    /**
     * converte il tempo da numero decimale
     */
    this.printTime=function(time){
        return Math.floor(time)+":"+((time%1)*6)+"0";
    }

    /**
     * funzione che permette di scrivere il tempo in formato adatto al database
     */
    this.printDbTime=function(time){
        if(time<10)
            return "0"+Math.floor(time)+":"+((time%1)*6)+"0:00";
        else
            return Math.floor(time)+":"+((time%1)*6)+"0:00";
    }
    /**
     * Funzione che aggiunge un singolo evento al percorso
     * input: evt
     * Strutturazione della tabella percorso:
     *      eventi_id
     *      percorsi_id
     *      ordine
     *      tempo_bk_id
     */
    this.addPoint=function(evtId,tempoId){
        this.maxPosition++;
        var px;
        var evt=evtman.eventList[evtId];
        //alert("addo, eh? "+dump(this.path));
        if(!phcman.path){
            phcman.path=Array();
        }
        graphman.closeActiveEvtWin();
        //alert(tempoId);
        try{
            phcman.path[phcman.maxPosition] = new Object();
            phcman.path[phcman.maxPosition].eventi_id=evt.id;
            phcman.path[phcman.maxPosition].percorsi_id=1;
            phcman.path[phcman.maxPosition].tempo=tempoId;
            for(px in evt.orari){
                if(evt.orari[px].id_tempo==tempoId){//si ipotizza che sia != null
                    break;
                }
            }
            phcman.path[phcman.maxPosition].tempoInizio=evt.orari[px].inizio;
            phcman.path[phcman.maxPosition].tempoFine=evt.orari[px].fine;
            phcman.path[phcman.maxPosition].ordine=this.maxPosition;
            phcman.path[phcman.maxPosition].lat=evt.lat;
            phcman.path[phcman.maxPosition].lon=evt.lon;
        } catch(exn){
            alert(dump(exn));
        }
    //alert("addato, eh?");
    }

    /**
     * rimuove tutti gli eventi del percorso a partire da un punto della mappa
     */
    this.removeFromOrder=function(ordine){
        this.maxPosition=ordine-1;
        for(var k in this.path){
            if(k>this.maxPosition)
                this.path[k]=null;
            
        }
        mapman.reloadCreatedPath();
    }

    this.drawPathFromLastPoint=function(latLon){
        mapman.drawPathBetweenTwoPoints(this.getLastPoint(), latLon);
    }

    /**
     * restituisce l'oggetto latlng di google maps per la posizione dell'ultimo elemento
     */
    this.getLastPoint=function(){
        if(this.path[this.maxPosition])
            return new google.maps.LatLng(this.path[this.maxPosition].lat, this.path[this.maxPosition].lon);
        else if(this.startingPosition)
            return this.startingPosition.getPosition();
        else return null;
    }
    /**
     * restituisce l'orario di fine dell'ultimo evento appartenente al percorso
     */
    this.getLastTime=function(){
        if(this.path[this.maxPosition]){
            //porcata causa ismuseum
            if((convertStringTimeToSeconds(this.path[this.maxPosition].tempoFine)-convertStringTimeToSeconds(this.path[this.maxPosition].tempoInizio))>(2*3600))
                return convertStringTimeToSeconds(this.path[this.maxPosition].tempoInizio);//non è detto che funzioni
            else
                return convertStringTimeToSeconds(this.path[this.maxPosition].tempoFine);//non è detto che funzioni
        }
        else if(this.startingPosition)
            return this.time*3600;
        else return null;
    }
    /**
     * restituisce lo status della classe
     */
    this.getStatus=function(){
        return this.status;
    }

    /**
     * restituisce le coordinate dell'attuale percorso in fase di creazione
     * sottoforma di array
     */
    this.getPathCoordinates=function(){
        var arret=Array();
        var myLat,myLon;
        if(this.startingPosition){
            arret[0]=(this.startingPosition.getPosition());
        }
        for(var i = 1;i<=this.maxPosition;i++){
            //alert(dump(phcman.path[i]));
            myLat=phcman.path[i].lat;
            myLon=phcman.path[i].lon;
            arret[i]=new google.maps.LatLng(myLat,myLon);
        }
        return arret;
    }
    /**
     * restituisce il path
     */
    this.getPath=function(){
        return this.path;
    }
}